home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2001 / MacHack 2001.toast / pc / The Hacks / AntiLib / IdleWatcher.c < prev   
Encoding:
C/C++ Source or Header  |  2001-06-23  |  5.1 KB  |  246 lines

  1. #include <Types.h>
  2. #include <Events.h>
  3. #include <Fonts.h>
  4. #include <Menus.h>
  5. #include <Windows.h>
  6. #include <Dialogs.h>
  7. #include <Devices.h>
  8. #include <AERegistry.h>
  9. #include <AppleEvents.h>
  10. #include <AEDataModel.h>
  11. #include <stdio.h>
  12. #include <string.h>
  13.  
  14. #define NOLIB "\pYou're trying to run a Mad Lib, aren't you?"
  15. #define YES "\pYes..."
  16. #define SHAME "\pI'm so ashamed."
  17.  
  18. static AEEventHandlerUPP    originaldlog;
  19.  
  20. static OSErr dlog(const AppleEvent *ev, AppleEvent *reply, UInt32 refcon)
  21. {
  22.     char        buf[256] = "";
  23.     unsigned long        actualType;
  24.     long            actualSize;
  25.     
  26.     if (AESizeOfParam(ev, 'dtxt', &actualType, &actualSize) == noErr &&
  27.         AEGetParamPtr(ev, keyDirectObject, typeText, &actualType, buf, sizeof(buf), &actualSize) == noErr)
  28.     {
  29.         buf[actualSize] = '\0';
  30.         
  31.         if (strstr(buf, "noun") || strstr(buf, "verb") || strstr(buf, "adjective")) {
  32.             AppleEvent *evv = (AppleEvent *) ev;
  33.             
  34.             AEPutParamPtr(evv, keyDirectObject, typePString, NOLIB, StrLength(NOLIB)+1);
  35.             
  36.             // Button list
  37.             {
  38.                 AEDescList btns;
  39.                 SInt32 dbtn = 2;
  40.                 
  41.                 AECreateList(NULL, 0, false, &btns);
  42.                 AEPutPtr(&btns, 0, typePString, YES, StrLength(YES)+1);
  43.                 AEPutPtr(&btns, 0, typePString, SHAME, StrLength(SHAME)+1);
  44.                 AEPutParamDesc(evv, 'btns', &btns);
  45.                 AEDisposeDesc(&btns);
  46.                 AEPutParamPtr(evv, 'dflt', typeSInt32, &dbtn, sizeof(dbtn));
  47.             }
  48.             
  49.             CallAEEventHandlerProc(originaldlog, evv, reply, refcon);
  50.             return errAEEventNotHandled;
  51.         }
  52.     }
  53.     
  54.     return CallAEEventHandlerProc(originaldlog, ev, reply, refcon);
  55. }
  56.  
  57.  
  58. static void Initialize()
  59. {
  60.     MenuHandle    m;
  61.     AEEventHandlerUPP    upp;
  62.     SInt32                refcon;
  63.     
  64.     /* Initialize all the needed managers. */
  65.     InitGraf(&qd.thePort);
  66.     InitFonts();
  67.     InitWindows();
  68.     InitMenus();
  69.     TEInit();
  70.     InitDialogs(NULL);
  71.     InitCursor();
  72.  
  73.     m = GetMenu(128);
  74.     if (m) {
  75.         AppendResMenu(m, 'DRVR');
  76.         InsertMenu(m, 0);
  77.     }
  78.     
  79.     m = GetMenu(129);
  80.     if (m)
  81.         InsertMenu(m, NULL);
  82.  
  83.     DrawMenuBar();
  84.  
  85.     
  86.     upp = NewAEEventHandlerProc(dlog);
  87.     AEGetEventHandler('syso', 'dlog', &originaldlog, &refcon, true);
  88.     AEInstallEventHandler('syso', 'dlog', upp, 0, true);
  89. }
  90.  
  91. static void setitemtext(DialogPtr d, DialogItemIndex i, const char *s)
  92. {
  93.     DialogItemType    itemType;
  94.     Handle            item;
  95.     Rect            box;
  96.     
  97.     GetDialogItem(d, i, &itemType, &item, &box);
  98.     setdialogitemtext(item, s);
  99. }
  100.  
  101. static void UpdateDisplay(DialogPtr d, UInt32 sleep_time, UInt32 nulls, UInt32 interval)
  102. {
  103.     static Boolean    phase = false;
  104.     float            nps, est_nps;
  105.     char            s[256];
  106.     
  107.     sprintf(s, "%ld ticks%c", sleep_time, phase ? '.' : ' ');
  108.     setitemtext(d, 3, s);
  109.     phase = !phase;
  110.     
  111.     nps = (float) nulls * 60.0 / interval;    // Null events per second.
  112.     est_nps = 60.0 / sleep_time;
  113.     
  114.     if (sleep_time == 0)
  115.     //    sprintf(s, "%ld (%0.1f/sec)", nulls, nps);
  116.         sprintf(s, "%0.1f/sec", nps);
  117.     else
  118.     //    sprintf(s, "%ld (%0.1f/sec, %0.0f%%)", nulls, nps, (nps / est_nps) * 100.0);
  119.         sprintf(s, "%0.1f/sec (%0.0f%%)", nps, (nps / est_nps) * 100.0);
  120.     setitemtext(d, 4, s);
  121. }
  122.  
  123. static Boolean DoMenuCommand(long cmd, UInt32 &sleep_time, Boolean &done)
  124. {
  125.     short item = (cmd & 0x0FFFF);
  126.     
  127.     HiliteMenu(0);
  128.     switch (cmd >> 16) {
  129.         case 128: {
  130.             Str255    name;
  131.             
  132.             GetMenuItemText(GetMenuHandle(128), item, name);
  133.             OpenDeskAcc(name);
  134.             return false;
  135.         }
  136.         
  137.         case 129: {
  138.             switch (item) {
  139.                 case 1: /* Sleep less */
  140.                     if (sleep_time > 0) {
  141.                         --sleep_time;
  142.                         return true;
  143.                     }
  144.                     else
  145.                         return false;
  146.                 
  147.                 case 2: /* Sleep more */
  148.                     ++sleep_time;
  149.                     return true;
  150.                 
  151.                 case 4: /* Quit */
  152.                     done = true;
  153.                     return false;
  154.                 
  155.                 default:
  156.                     return false;
  157.             }
  158.             break;
  159.         }
  160.     }
  161.     return false;
  162. }
  163.  
  164. void main()
  165. {
  166.     DialogPtr    d = NULL;
  167.     
  168.     Initialize();
  169.     
  170.     d = GetNewDialog(128, NULL, (WindowPtr) -1L);
  171.     
  172.     if (d) {
  173.         UInt32            last_time, interval;
  174.         UInt32            sleep_time = 1;
  175.         UInt32            nulls = 0;
  176.         Boolean            done = false;
  177.         EventRecord        ev;
  178.         
  179.         last_time = TickCount();
  180.         
  181.         do {
  182.             WaitNextEvent(everyEvent, &ev, sleep_time, NULL);
  183.             
  184.             interval = TickCount() - last_time;
  185.             
  186.             switch (ev.what) {
  187.                 case nullEvent:
  188.                     nulls++;
  189.                     break;
  190.                 
  191.                 case updateEvt:
  192.                     BeginUpdate(d);
  193.                     DrawDialog(d);
  194.                     EndUpdate(d);
  195.                     break;
  196.                 
  197.                 case mouseDown: {
  198.                     WindowPtr        w;
  199.                     
  200.                     switch (FindWindow(ev.where, &w)) {
  201.                         case inGoAway:
  202.                             if (TrackGoAway(w, ev.where))
  203.                                 done = true;
  204.                             break;
  205.                         
  206.                         case inMenuBar:
  207.                             if (DoMenuCommand(MenuSelect(ev.where), sleep_time, done))
  208.                                 UpdateDisplay(d, sleep_time, nulls, interval);
  209.                             break;
  210.                         
  211.                         case inSysWindow:
  212.                             SystemClick(&ev, w);
  213.                             break;
  214.                         
  215.                         case inDrag: {
  216.                             Rect dragRect = (*GetGrayRgn())->rgnBBox;
  217.                             DragWindow(w, ev.where, &dragRect);
  218.                             break;
  219.                         }
  220.                         
  221.                         default:
  222.                             break;
  223.                     }
  224.                     break;
  225.                 }
  226.                 
  227.                 case keyDown:
  228.                 case autoKey:
  229.                     if (DoMenuCommand(MenuKey(ev.message & charCodeMask), sleep_time, done))
  230.                         UpdateDisplay(d, sleep_time, nulls, interval);
  231.                     break;
  232.             }
  233.             
  234.             if (interval >= 60) {
  235.                 UpdateDisplay(d, sleep_time, nulls, interval);
  236.                 nulls = 0;
  237.                 last_time = TickCount();
  238.             }
  239.         } while (!done);
  240.         
  241.         DisposeDialog(d);
  242.     }
  243.  
  244.     AEInstallEventHandler('syso', 'dlog', originaldlog, 0, true);
  245. }
  246.